/**
 * 此文件作为Generator的核心入口
 * 需要导出一个继承自Yeoman Generator 的类型
 * Yeoman Generator 在工作时会自动调用我们在此类型中定义的一些生命周期方法
 * 我们在这些方法中可以通过调用父类提供的一些工具方法实现一些功能,例如文件写入
 * 
*/
const Generator = require('yeoman-generator');
module.exports = class extends Generator {
	prompting(){
		//Yeoman在询问用户环节会调用次方法
		//在此方法中可以调用父类的prompt（）方法发出对用户的命令行询问
		// prompt方法返回的是Promise方法，所以我们要return出去,这样Yeoman有一个更好的异步流程控制
		
		return this.prompt({//prompt参数接收一个对象
			type:'input',//类型：使用用户输入的方式
			name:'name',//就是我们最终得到结果的一个键
			message:'Your project name ',//message就是在界面上给用户的一个提示，也就是我们所谓的问题
			default:this.appname//appname是父类当中自动帮我们拿到的当前生成项目这个目录的文件夹的名字，它被作为我们这个问题的默认值
		})
		.then(answers=>{
			//answers是当前问题接收完用户输入的一个结果，它会以一个对象的形式出现，对象里的键就是我们刚刚输入的name，值就是用户输入的value
			//answers =>{name:'user input value'}
			// 将这个值挂载到this对象上面，一遍在后面warting时使用它
			this.answers = answers;
			// 有了answers以后我们可以把它传入我们的模板引擎，使用这个作为我们的上下文
		})
	}
    writing(){
        //Yeoman 自动在生成文件阶段调用此方法
        //我们这里尝试往项目目录中写入文件
        // this.fs.write(
        //     this.destinationPath('temp.txt'),
        //     Math.random().toString()
        // )
		
		// 通过模板方式写入文件到模板目录
		// 模板路径
		// const tmpl = this.templatePath('foo.txt')
		const tmpl = this.templatePath('bar.html')
		// 输出模板目录
		// const output = this.destinationPath('foo.txt')
		const output = this.destinationPath('bar.html')
		// 模板上下文
		// const context = {title:'hello! hcb',success:false}
		// 使用answers作为上下文
		const context = this.answers;
		//copyTpl方法把我们的模板文件映射到输出文件上
		this.fs.copyTpl(tmpl,output,context);



        // // 通过模板方式写入文件到目标目录
        // //模板文件路径
        // const tmpl = this.templatePath('foo.txt')
        // // 输出目标目录
        // const output = this.destinationPath('foo.txt')
        // // 模板上下文
        // const context = {title:'hello! hcb',success:false}
        // // copyTpl方法把我们的模板文件映射到输出文件上
        // this.fs.copyTpl(tmpl,output,context) 
    }
    
}